Large Go repositories use either a multi-module layout with independent go.mod per service, or a single module with services under cmd/ and shared code under pkg/ and internal/.
Single module: simpler tooling, shared internal packages, atomic cross-service changes, but all services always built together
Multi-module: independent versioning and deployment, cleaner boundaries, but more tooling complexity with workspace files
Go workspaces (go.work): manage multi-module repos locally without replacing directives
Use buf for managing protobuf definitions and gRPC code generation across services
golangci-lint and Makefile or mage for consistent build/lint/test commands across services